package cn.xiaolang.function.java_gc;

/**
 * 标记对象是否存活--可达性分析法
 * <p>
 * <ul>
 * 本地变量中引用的对象
 * </ul>
 * <ul>
 * 方法区中静态变量引用的对象
 * </ul>
 * <ul>
 * 方法区中常量引用的对象
 * </ul>
 * <ul>
 * Native方法引用的对象
 * </ul>
 * </p>
 * 
 * @author fuhw/DeanKano
 * @date 2018-08-22
 */
public class MarkObjAliveByGcRootsDemo {
	public static MarkObjAliveByGcRootsDemo object;

	public void isAlive() {
		System.out.println("I'm alive");
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("method finalize is running");
		object = this;
	}

	public static void main(String[] args) throws Exception {

		object = new MarkObjAliveByGcRootsDemo();
		// 第一次执行，finalize方法会自救
		object = null;
		System.gc();

		Thread.sleep(500);
		if (object != null) {
			object.isAlive();
		} else {
			System.out.println("I'm dead");
		}

		// 第二次执行，finalize方法已经执行过
		object = null;
		System.gc();

		Thread.sleep(500);
		if (object != null) {
			object.isAlive();
		} else {
			System.out.println("I'm dead");
		}


	}
}
